home *** CD-ROM | disk | FTP | other *** search
/ Aminet 3 / Aminet 3 - July 1994.iso / Aminet / misc / unix / tracker_4_3.lzh / tracker / Amiga / requester.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-13  |  3.1 KB  |  143 lines

  1. /* requester.c 
  2.     vi:se ts=3 sw=3:
  3.  */
  4.  
  5. /* $Id: requester.c,v 1.5 1994/01/09 23:25:16 Espie Exp Espie $
  6.  * $Log: requester.c,v $
  7.  * Revision 1.5  1994/01/09  23:25:16  Espie
  8.  * Last bug fix.
  9.  *
  10.  * Revision 1.4  1994/01/09  17:38:28  Espie
  11.  * Generalized open.c.
  12.  *
  13.  * Revision 1.3  1994/01/09  04:49:18  Espie
  14.  * File requester !
  15.  *
  16.  * Revision 1.2  1994/01/07  15:08:54  Espie
  17.  * *** empty log message ***
  18.  *
  19.  * Revision 1.1  1994/01/06  22:37:26  Espie
  20.  * Initial revision
  21.  *
  22.  */
  23.  
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27.  
  28. #include <libraries/reqtools.h>
  29. #include <proto/reqtools.h>
  30. #include <proto/exec.h>
  31. #include <proto/dos.h>
  32. #include <dos/dos.h>
  33.  
  34. #include "defs.h"
  35. #include "extern.h"
  36. #include "amiga/amiga.h"
  37.  
  38. ID("$Id: requester.c,v 1.5 1994/01/09 23:25:16 Espie Exp Espie $")
  39. LOCAL void init_requester(void);
  40.  
  41. LOCAL struct ReqToolsBase *ReqToolsBase = 0;
  42.  
  43. LOCAL void (*INIT)(void) = init_requester;
  44.  
  45. LOCAL struct rtFileRequester *req = 0;
  46. LOCAL struct rtHandlerInfo *myhandler = 0;
  47.  
  48.  
  49.  
  50. LOCAL void close_requester()
  51.    {
  52.    if (myhandler)
  53.       rtReqHandler(myhandler, 0, RTRH_EndRequest, REQ_CANCEL, TAG_END);
  54.    if (req)
  55.       rtFreeRequest(req);
  56.    if (ReqToolsBase)
  57.       CloseLibrary(ReqToolsBase);
  58.    myhandler = 0;
  59.    req = 0;
  60.    ReqToolsBase = 0;
  61.    }
  62.  
  63. LOCAL void init_requester()
  64.    {
  65.    ReqToolsBase = OpenLibrary("reqtools.library", 38);
  66.    if (!ReqToolsBase)
  67.       {
  68.       requested_file(0);
  69.       return;
  70.       }
  71.    at_end(close_requester);
  72.    req = rtAllocRequestA(RT_FILEREQ, NULL);
  73.    }
  74.  
  75. LOCAL char fname[108];
  76.  
  77. void handle_requester(ULONG received)
  78.    {   
  79.    struct amiganame *new;
  80.    int total;
  81.    struct rtFileList *flist, *sweep;
  82.    struct MinList temp;
  83.    int result;
  84.  
  85.    if ( (result = rtReqHandler(myhandler, received, TAG_END)) == CALL_HANDLER)
  86.       return;
  87.    remove_req_handler();
  88.    myhandler = 0;
  89.    flist = (struct rtFileList *)result;
  90.  
  91.    if (flist)
  92.       {
  93.       NewList(&temp);      /* use temp as a `place holder' */
  94.       sweep = flist;
  95.       while(sweep)
  96.          {
  97.          total = strlen(req->Dir) + strlen(sweep->Name) + 2;
  98.          new = malloc(sizeof(struct amiganame) + total);
  99.          if (!new)
  100.             continue;
  101.          AddPart(strcpy(new->s, req->Dir), sweep->Name, total);
  102.          new->i = TRUE;
  103.          AddTail(&temp, new);
  104.          sweep = sweep->Next;
  105.          }
  106.       rtFreeFileList(flist);
  107.       
  108.       if (temp.mlh_TailPred != &temp)
  109.          {
  110.          /* unscrew the first element of temp out and loop the elements */
  111.  
  112.          new = temp.mlh_Head;
  113.          new->n.mln_Pred = temp.mlh_TailPred;
  114.          temp.mlh_TailPred->mln_Succ = new;
  115.    
  116.          requested_file(new);
  117.          }
  118.       else
  119.          requested_file(0);
  120.       }
  121.    else
  122.       requested_file(0);
  123.    }
  124.    
  125. void launch_requester()
  126.    {
  127.    INIT_ONCE;
  128.    
  129.    if (myhandler || !req)
  130.       return;
  131.    if (CALL_HANDLER != (int)rtFileRequest(req, fname, "Load song", 
  132.       RTFI_Flags, FREQF_MULTISELECT,
  133.       RT_ReqHandler, &myhandler, TAG_END))
  134.       {
  135.       myhandler = 0;
  136.       return;
  137.       }
  138.    install_req_handler(myhandler->WaitMask, handle_requester);
  139.    if (myhandler->DoNotWait)
  140.       handle_requester(0);
  141.    }
  142.  
  143.